-- 锁的 key
local lockKey = KEYS[1]
-- 线程唯一标识
local threadId = ARGV[1]
-- 锁自动释放时间
local leaseTime = ARGV[2]

-- 判断锁当前锁如果没有被自己持有，则直接返回
if (redis.call('hexists', lockKey, threadId) == 0) then
    return nil
end

-- 是自己的锁，则重入次数 -1
local count = redis.call('hincrby', lockKey, threadId, -1)
-- 判断重入次数是否已经为 0
if (count > 0) then
    -- 重入次数大于 0，说明不能删除锁
    -- 重置有效期后，则直接返回
    redis.call('expire', lockKey, leaseTime)
    return 0
else
     -- 重入次数为 0，表明可以删除锁了
     redis.call('del', lockKey)
     return 1
end